/*
 * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package io.iec.edp.caf.rpc.api.grpc;

import io.grpc.Metadata;
import io.iec.edp.caf.commons.core.SerializerFactory;
import io.iec.edp.caf.commons.core.enums.SerializeType;
import lombok.Builder;
import lombok.var;

import java.time.OffsetDateTime;
import java.util.Base64;
import java.util.HashMap;

@Builder
public class GrpcExceptionMetaData {
    private String code;
    private int level;
    private String message;
    private String innerMessage;
    private OffsetDateTime date;
    private String detail;
    private String requestId;
    private String exceptionType;
    private Boolean isBizException=false;
    private HashMap<String, String> extensionMessage;

    public Metadata buildMetaData(){
        var metadata = new Metadata();
        var serializer = SerializerFactory.getSerializer(SerializeType.Protobuf);
        if(code!=null && code.length()>0){
            metadata.put(Metadata.Key.of(GrpcVariable.GRPC_EX_CODE, Metadata.ASCII_STRING_MARSHALLER),code);
        }
        metadata.put(Metadata.Key.of(GrpcVariable.GRPC_EX_LEVEL, Metadata.ASCII_STRING_MARSHALLER),serializer.serializeToString(level));
        if(message!=null && message.length()>0){
            metadata.put(Metadata.Key.of(GrpcVariable.GRPC_EX_MESSAGE, Metadata.ASCII_STRING_MARSHALLER),message);
        }
        if(innerMessage!=null && innerMessage.length()>0){
            metadata.put(Metadata.Key.of(GrpcVariable.GRPC_EX_INNERMESSAGE, Metadata.ASCII_STRING_MARSHALLER),innerMessage);
        }
        if(date!=null){
            metadata.put(Metadata.Key.of(GrpcVariable.GRPC_EX_DATE, Metadata.ASCII_STRING_MARSHALLER),serializer.serializeToString(date));
        }
        if(detail!=null && detail.length()>0){
            metadata.put(Metadata.Key.of(GrpcVariable.GRPC_EX_DETAIL, Metadata.ASCII_STRING_MARSHALLER),serializer.serializeToString(detail));
        }
        if(requestId!=null && requestId.length()>0){
            metadata.put(Metadata.Key.of(GrpcVariable.GRPC_EX_REQUESTID, Metadata.ASCII_STRING_MARSHALLER),requestId);
        }
        if(extensionMessage!=null && extensionMessage.size()>0){
            metadata.put(Metadata.Key.of(GrpcVariable.GRPC_EX_EXTENSION_MESSAGE, Metadata.ASCII_STRING_MARSHALLER),
                    serializer.serializeToString(extensionMessage));
        }
        if(exceptionType!=null && exceptionType.length()>0){
            metadata.put(Metadata.Key.of(GrpcVariable.GRPC_EX_TYPE, Metadata.ASCII_STRING_MARSHALLER),
                    exceptionType);
        }

        metadata.put(Metadata.Key.of(GrpcVariable.GRPC_EX_BIZEXCEPTION, Metadata.ASCII_STRING_MARSHALLER),
                serializer.serializeToString(isBizException));

        return metadata;
    }
}
